#ifndef CONNECTIONPOOL_H
#define CONNECTIONPOOL_H

#include <QObject>
#include <QMutexLocker>
#include <QWaitCondition>
#include <QThread>
#include <QSqlDatabase>
#include <QSqlError>
#include <QQueue>
#include <QUuid>
#include <QDebug>
#include <QThreadPool>
#include <QtConcurrent>

class ConnectionPool : public QObject
{
    Q_OBJECT
public:
    ~ConnectionPool();
    static	ConnectionPool*  getConnectionPool();
    ConnectionPool(const ConnectionPool& obj) = delete;
    ConnectionPool& operator =(const ConnectionPool& obj) = delete;
    QSqlDatabase* getConnection(); //获取连接
    void closeConnection(QSqlDatabase* db);

private:
    ConnectionPool(QObject *parent = nullptr);
    void recycleConnection(); // 空闲连接回收器
    void pingConnection(); // 连接保活
    void addConnection(); // 添加连接
    void getSqlSetting(); // 通过json文件获取参数

    // 数据库配置参数
    QString m_driverType; //驱动类型
    QString m_hostName;   //主机名称
    int m_port; //端口号
    QString m_databaseName; //数据库名称
    QString m_userName; //用户名
    QString m_password; //密码

    // 池参数
    int m_minCount; //最小空闲数
    int m_maxCount; //最大连接数
    int m_timeOut;  //获取连接超时时长ms
    int m_maxIdleTime; //闲置超时时间ms，超过最小空闲数才会发挥作用
    QQueue<QSqlDatabase*> m_freeConnection; //可用连接列表
    QQueue<QSqlDatabase*> m_usedConnection; //已用连接列表
    QMutex m_mutex;  //互斥锁
    QWaitCondition m_cond; //条件变量

    QThread *thr1;
    QThread *thr2;
};

#endif // CONNECTIONPOOL_H
